<?php
namespace Org\Type;
class CatTree {
	private static $id 		= 'catsid';     //表的id字段
	private static $pid 	= 'pid';    //表的父级pid字段
	private static $son 	= 'subcat'; //如果有子数组，子数组下标，可以自定义值

	/**
	 * 获取分类数结构
	 * @param $items array 从数据库查询出来的分类信息（二维数组）
	 */
	public static function getTree($items){
		if(empty($items)){
			return array();
		}
		$tree = array();	//定义分类数组
		$tmpMap = array();  	//临时变量
		//将传入的数据数组中的每个元素下标改变为类别本身$id的值
		foreach ($items as $item) {
			$tmpMap[$item[self::$id]] = $item;
		}
		//遍历传入数据数组
		foreach ($items as $item) {

			//每个类别必定有一个pid,判断临时数组中以类别的pid为下标的元素是否存在,
			if (isset($tmpMap[$item[self::$pid]])) {
				//如果存在，就将这个类别添加进临时数组中以类别pid为下标的子数组，下标为subcat,意义为子分类
				$tmpMap[$item[self::$pid]][self::$son][] = &$tmpMap[$item[self::$id]];
			} else {
				//如果不存在(类别的pid为0)就将这个类别添加进分类数组，意义为顶级类别
				$tree[] = &$tmpMap[$item[self::$id]];
			}
		}
		return $tree;
	}

	public static function getlist($allcats,$pid=0){

		$tree = array();                                //每次都声明一个新数组用来放子元素
		foreach($allcats as $v){
			if($v[self::$pid] == $pid){                      //匹配子类别
				$v[self::$son] = self::getlist($allcats,$v[self::$id]); //递归获取子类别
				if($v[self::$son] == null){
					unset($v[self::$son]);             //如果子元素为空则unset()进行删除，说明已经到该分支的最后一个元素了
				}
				$tree[] = $v;                           //将记录存入新数组
			}
		}
		return $tree;
	}

}
